package everyday;

/**
 * @author zhangmin
 * @create 2022-05-02 17:04
 * 只出现一次的数字3
 * 给定一个整数数组 nums，其中恰好有两个元素只出现一次，其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
 *
 * 思路：
 * 分组异或，先将所有元素求异或和，在异或和中找到一个二进制为1的位，这一位一定能标识出两个只出现一次的数字，
 * 然后对每个元素对这一位判断，为0的分为一组，为1的分为一组，然后在两组分别异或后得到两个数字就是结果。
 * 因为相同的数字一定会被分到同一组，异或后为0
 */
public class singleNumber260 {
    public int[] singleNumber(int[] nums) {
        int xorsum=0;
        for (int i = 0; i < nums.length; i++) {
            xorsum^=nums[i];
        }
        //需要检查边界
        int xor=Integer.MIN_VALUE==xorsum?xorsum:xorsum&(-xorsum);
        int t1=0,t2=0;
        for (int num:nums) {
            if ((xor&num)!=0){
                t1^=num;
            }else {
                t2^=num;
            }
        }
        return new int[]{t1,t2};
    }
}
